home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / net / RCS / res_init.c,v < prev    next >
Text File  |  1988-06-20  |  5KB  |  163 lines

  1. head     1.1;
  2. access   ;
  3. symbols  ;
  4. locks    ; strict;
  5. comment  @ * @;
  6.  
  7.  
  8. 1.1
  9. date     88.06.20.09.57.18;  author ouster;  state Exp;
  10. branches ;
  11. next     ;
  12.  
  13.  
  14. desc
  15. @@
  16.  
  17.  
  18.  
  19. 1.1
  20. log
  21. @Initial revision
  22. @
  23. text
  24. @/*
  25.  * Copyright (c) 1985 Regents of the University of California.
  26.  * All rights reserved.
  27.  *
  28.  * Redistribution and use in source and binary forms are permitted
  29.  * provided that this notice is preserved and that due credit is given
  30.  * to the University of California at Berkeley. The name of the University
  31.  * may not be used to endorse or promote products derived from this
  32.  * software without specific prior written permission. This software
  33.  * is provided ``as is'' without express or implied warranty.
  34.  */
  35.  
  36. #if defined(LIBC_SCCS) && !defined(lint)
  37. static char sccsid[] = "@@(#)res_init.c    6.8 (Berkeley) 3/7/88";
  38. #endif /* LIBC_SCCS and not lint */
  39.  
  40. #include <sys/types.h>
  41. #include <sys/socket.h>
  42. #include <netinet/in.h>
  43. #include <stdio.h>
  44. #include <arpa/nameser.h>
  45. #include <resolv.h>
  46.  
  47. /*
  48.  * Resolver configuration file. Contains the address of the
  49.  * inital name server to query and the default domain for
  50.  * non fully qualified domain names.
  51.  */
  52.  
  53. #ifndef    CONFFILE
  54. #define    CONFFILE    "/etc/resolv.conf"
  55. #endif
  56.  
  57. /*
  58.  * Resolver state default settings
  59.  */
  60.  
  61. struct state _res = {
  62.     RES_TIMEOUT,                   /* retransmition time interval */
  63.     4,                             /* number of times to retransmit */
  64.     RES_DEFAULT,        /* options flags */
  65.     1,                             /* number of name servers */
  66. };
  67.  
  68. /*
  69.  * Set up default settings.  If the configuration file exist, the values
  70.  * there will have precedence.  Otherwise, the server address is set to
  71.  * INADDR_ANY and the default domain name comes from the gethostname().
  72.  *
  73.  * The configuration file should only be used if you want to redefine your
  74.  * domain or run without a server on your machine.
  75.  *
  76.  * Return 0 if completes successfully, -1 on error
  77.  */
  78. res_init()
  79. {
  80.     register FILE *fp;
  81.     register char *cp, **pp;
  82.     char buf[BUFSIZ];
  83.     extern u_long inet_addr();
  84.     extern char *index();
  85.     extern char *strcpy(), *strncpy();
  86.     extern char *getenv();
  87.     int n = 0;    /* number of nameserver records read from file */
  88.  
  89.     _res.nsaddr.sin_addr.s_addr = INADDR_ANY;
  90.     _res.nsaddr.sin_family = AF_INET;
  91.     _res.nsaddr.sin_port = htons(NAMESERVER_PORT);
  92.     _res.nscount = 1;
  93.     _res.defdname[0] = '\0';
  94.  
  95.     if ((fp = fopen(CONFFILE, "r")) != NULL) {
  96.         /* read the config file */
  97.         while (fgets(buf, sizeof(buf), fp) != NULL) {
  98.             /* read default domain name */
  99.             if (!strncmp(buf, "domain", sizeof("domain") - 1)) {
  100.                 cp = buf + sizeof("domain") - 1;
  101.                 while (*cp == ' ' || *cp == '\t')
  102.                     cp++;
  103.                 if (*cp == '\0')
  104.                     continue;
  105.                 (void)strncpy(_res.defdname, cp, sizeof(_res.defdname));
  106.                 _res.defdname[sizeof(_res.defdname) - 1] = '\0';
  107.                 if ((cp = index(_res.defdname, '\n')) != NULL)
  108.                     *cp = '\0';
  109.                 continue;
  110.             }
  111.             /* read nameservers to query */
  112.             if (!strncmp(buf, "nameserver", 
  113.                sizeof("nameserver") - 1) && (n < MAXNS)) {
  114.                 cp = buf + sizeof("nameserver") - 1;
  115.                 while (*cp == ' ' || *cp == '\t')
  116.                     cp++;
  117.                 if (*cp == '\0')
  118.                     continue;
  119.                 _res.nsaddr_list[n].sin_addr.s_addr = inet_addr(cp);
  120.                 if (_res.nsaddr_list[n].sin_addr.s_addr == (unsigned)-1) 
  121.                     _res.nsaddr_list[n].sin_addr.s_addr = INADDR_ANY;
  122.                 _res.nsaddr_list[n].sin_family = AF_INET;
  123.                 _res.nsaddr_list[n].sin_port = htons(NAMESERVER_PORT);
  124.                 if ( ++n >= MAXNS) { 
  125.                     n = MAXNS;
  126. #ifdef DEBUG
  127.                     if ( _res.options & RES_DEBUG )
  128.                         printf("MAXNS reached, reading resolv.conf\n");
  129. #endif DEBUG
  130.                 }
  131.                 continue;
  132.             }
  133.         }
  134.         if ( n > 1 ) 
  135.             _res.nscount = n;
  136.         (void) fclose(fp);
  137.     }
  138.     if (_res.defdname[0] == 0) {
  139.         if (gethostname(buf, sizeof(_res.defdname)) == 0 &&
  140.            (cp = index(buf, '.')))
  141.              (void)strcpy(_res.defdname, cp + 1);
  142.     }
  143.  
  144.     /* Allow user to override the local domain definition */
  145.     if ((cp = getenv("LOCALDOMAIN")) != NULL)
  146.         (void)strncpy(_res.defdname, cp, sizeof(_res.defdname));
  147.  
  148.     /* find components of local domain that might be searched */
  149.     pp = _res.dnsrch;
  150.     *pp++ = _res.defdname;
  151.     for (cp = _res.defdname, n = 0; *cp; cp++)
  152.     if (*cp == '.')
  153.         n++;
  154.     cp = _res.defdname;
  155.     for (; n >= LOCALDOMAINPARTS && pp < _res.dnsrch + MAXDNSRCH; n--) {
  156.     cp = index(cp, '.');
  157.     *pp++ = ++cp;
  158.     }
  159.     _res.options |= RES_INIT;
  160.     return(0);
  161. }
  162. @
  163.